﻿/*
 * 由SharpDevelop创建
 * 用户： 吃爆米花的小熊
 * 日期: 1997/7/24 
 * 
 * 遵循WTPFL协议
 * 删除空行^\s*\n
 */
using System;
using PEPlugin;
using PEPlugin.SDX;
using PEPlugin.Form;
using PEPlugin.Pmd;
using PEPlugin.Pmx;
using PEPlugin.View;
using System.Collections.Generic;
using System.Linq;

namespace PEHelper
{
	/// <summary>
	/// 骨骼操作函数
	/// </summary>
	public class IFBone
	{
			public int GetFormSelectedBone(IPEFormConnector Form) 
			{
				int SelectedItem = Form.SelectedBoneIndex;
				if (SelectedItem >= 0) 
				{
					return SelectedItem;
				} else 
				{
					throw new System.Exception("请先在列表中选择骨骼");
				}
			}
 
			public int GetFormSelectedNode(IPEFormConnector Form) 
			{
			    int SelectedItem =Form.SelectedFrameBoneIndex;
			    if (SelectedItem >= 0) 
			    {
			        return SelectedItem;
			    } else 
			    {
			        throw new System.Exception("请先在列表中选择表示枠");
			    }
			}
			
			/// <summary>
			/// 获取骨骼index值
			/// </summary>
			/// <param name="BoneName">骨骼名</param>
			/// <returns>骨骼Index</returns>
			public int GetBoneIndexFromName(IPXPmx PMX,string BoneName) 
			{
			    for (int i = 0; i < PMX.Bone.Count; i++) 
			    {
			        if (PMX.Bone[i].Name == BoneName) 
			        {
			            return i;
			        }
			    }
			    return -1;
			}

			 
		/// <summary>
        /// 克隆骨骼
        /// </summary>
        /// <param name="BaseBone"></param>
        /// <returns></returns>
        public IPXBone CloneBone(IPXBone BaseBone)
        {
            IPXBone CloneBone = (IPXBone)BaseBone.Clone();
            CloneBone.Name = BaseBone.Name + "+";
            CloneBone.NameE = BaseBone.NameE + "+";
            return CloneBone;
        } 
		
		/// <summary>
        /// 添加IK骨
        /// </summary>
        /// <param name="Bone"></param>
        /// <param name="TargetBone"></param>
        /// <param name="Angle"></param>
        /// <param name="LoopCount"></param>
        public void AddIK(IPXBone Bone, IPXBone TargetBone, float Angle = 1.0f, int LoopCount = 20)
        {
            Bone.IsIK = true;
            //コード内はラジアンでPMDE上の表記は度数なので気をつけること。
            Bone.IK.Angle = Angle;
            Bone.IK.LoopCount = LoopCount;
            Bone.IK.Target = TargetBone;
        }        
        
        /// <summary>
        /// 添加IKLink
        /// IK角度制限をしない場合はこちら
        /// </summary>
        /// <param name="Bone"></param>
        /// <param name="LinkBone"></param>
        public void AddIKLink(IPXBone Bone, IPXBone LinkBone)
        {
            IPXIKLink IKLink = (IPXIKLink)PEStaticBuilder.Pmx.IKLink();
            IKLink.Bone = LinkBone;
            Bone.IK.Links.Add(IKLink);
        } 
        
        /// <summary>
        /// 与えられたボーンをPMDView上で選択する
        /// </summary>
        /// <param name="BoneList"></param>
//        public void SelectBones4PMDView(IPEPMDViewConnector PMDView,List<IPXBone> BoneList)
//        {
//            List<int> IndexList = new List<int>();
//            for (int i = 0; i < BoneList.Count; i++)
//            {
//                IndexList.Add(this.GetBoneIndex(BoneList[i], 1));
//            }
//            PMDView.SetSelectedBoneIndices(IndexList.ToArray());
//        }
        
        /// <summary>
        /// PMXViewで選択したボーンのリストを返します。
        /// </summary>
        /// <returns></returns>
//        public List<IPXBone> GetSelectdeBoneList(IPEPMDViewConnector PMDView)
//        {
//            int[] SelectedItem = PMDView.GetSelectedBoneIndices();
//            if (SelectedItem.Length == 0)
//            {
//                throw new System.Exception("ボーンを選択していません。");
//            }
//            List<IPXBone> RetList = new List<IPXBone>();
//            for (int i = 0; i < SelectedItem.Length; i++)
//            {
//                RetList.Add(this.PMX.Bone[SelectedItem[i]]);
//            }
//            return RetList;
//        }
        
        
		
			
		//****************************************************	
	}
	
	//材质篇 
	public class IFMaterial
	{
        /// <summary>
		/// 获取材质index值
		/// </summary>
		/// <param name="MaterialName">材质名</param>
		/// <returns>材质Index</returns>
		public int GetMaterialIndex(IPXPmx PMX,string MaterialName) 
		{
		    for (int i = 0; i < PMX.Material.Count; i++) 
		    {
		        if (PMX.Material[i].Name == MaterialName) 
		        {
		            return i;
		        }
		    }
		    return -1;
		}

		public string GetMaterialName(IPXPmx PMX,int MaterialIndex) 
		{ 
			return PMX.Material[MaterialIndex].Name;
		}
		
				 
		public void AddMaterial(IPXPmx PMX) 
		{
		    IPXMaterial mat = (IPXMaterial)PEStaticBuilder.Pmx.Material();
		    PMX.Material.Add(mat);
		} 

	}
	
	public class IFVertex
	{
		public void AddVertex(IPXPmx PMX,V3 pos) 
		{
		    IPXVertex vt = (IPXVertex)PEStaticBuilder.Pmx.Vertex();
		    vt.Position=pos;
		    PMX.Vertex.Add(vt);
		}
	}
	
	public class IFFace
	{
		//指定順序で面を生成して指定材質に追加する
　　　　public void createFace ( IPXVertex v1 , IPXVertex v2 , IPXVertex v3 , IPXMaterial taregtMaterial )
　　　　{
　　　　　　IPXFace cf = (IPXFace)PEStaticBuilder.Pmx.Face();
　　　　　　cf.Vertex1 = v1;
　　　　　　cf.Vertex2 = v2;
　　　　　　cf.Vertex3 = v3;
　　　　　　taregtMaterial.Faces.Add(cf);
　　　　}
	}
}
